/**
 * 微信API服务类
 * 统一管理所有微信相关的API调用
 */

// 微信API配置
const WECHAT_API_CONFIG = {
	// 基础配置
	appid: 'wx508c57a53dbbd81b',
	secret: '6f73edcc244fa25b4bd606e75b9c207a',
	
	// API地址
	baseUrl: 'https://api.weixin.qq.com',
	endpoints: {
		// 获取access_token
		accessToken: '/cgi-bin/token',
		// 获取openid和session_key
		code2Session: '/sns/jscode2session',
		// 获取手机号
		phoneNumber: '/wxa/business/getuserphonenumber?access_token='
	}
}

/**
 * 统一的网络请求方法
 * @param {Object} options 请求配置
 * @returns {Promise}
 */
function request(options) {
	return new Promise((resolve, reject) => {
		const { url, method = 'GET', data = {}, showLoading = true, loadingText = '请求中...' } = options
		
		// 显示加载提示
		if (showLoading) {
			uni.showLoading({
				title: loadingText,
				mask: true
			})
		}
		
		// 构建完整URL
		const fullUrl = url.startsWith('http') ? url : WECHAT_API_CONFIG.baseUrl + url
		
		console.log(`🌐 API请求: ${method} ${fullUrl}`, data)
		
		wx.request({
			url: fullUrl,
			method: method,
			data: data,
			success: (res) => {
				console.log(`✅ API响应: ${fullUrl}`, res.data)
				
				if (showLoading) {
					uni.hideLoading()
				}
				
				// 检查微信API错误
				if (res.data.errcode && res.data.errcode !== 0) {
					const error = new Error(res.data.errmsg || '微信API调用失败')
					error.errcode = res.data.errcode
					reject(error)
					return
				}
				
				resolve(res.data)
			},
			fail: (err) => {
				console.error(`❌ API请求失败: ${fullUrl}`, err)
				
				if (showLoading) {
					uni.hideLoading()
				}
				
				reject(new Error(err.errMsg || '网络请求失败'))
			}
		})
	})
}

/**
 * 微信API服务类
 */
class WechatApiService {
	constructor() {
		this.config = WECHAT_API_CONFIG
	}
	
	/**
	 * 获取小程序全局access_token
	 * @returns {Promise<string>}
	 */
	async getAccessToken() {
		try {
			const result = await request({
				url: this.config.endpoints.accessToken,
				method: 'GET',
				data: {
					grant_type: 'client_credential',
					appid: this.config.appid,
					secret: this.config.secret
				},
				showLoading: false,
				loadingText: '获取access_token中...'
			})
			
			return result.access_token
		} catch (error) {
			console.error('获取access_token失败:', error)
			throw error
		}
	}
	
	
	
	/**
	 * 获取用户手机号（支持两种调用方式）
	 * @param {Object} params 参数对象
	 * @param {string} [params.code] 新版本：手机号获取凭证
	 * @param {string} [params.encryptedData] 旧版本：加密数据
	 * @param {string} [params.iv] 旧版本：初始向量
	 * @param {string} [params.session_key] 旧版本：会话密钥
	 * @returns {Promise<Object>}
	 */
	async getPhoneNumber(params) {
		try {
			// 根据参数类型选择调用方式
			if (params.code) {
				// 新版本：使用code直接获取
				const accessToken = await this.getAccessToken()
				console.log("accessToken--->"+accessToken)
				const result = await request({
					url: this.config.endpoints.phoneNumber + accessToken,
					method: 'POST',
					data: {
						code: params.code
					},
					showLoading: true,
					loadingText: '获取手机号中...'
				})
				
				return {
					phoneNumber: result.phone_info.phoneNumber,
					purePhoneNumber: result.phone_info.purePhoneNumber,
					countryCode: result.phone_info.countryCode
				}
			} else {
				// 旧版本：使用encryptedData解密
				// 这里应该调用后端解密接口
				const result = await request({
					url: '/api/wechat/decrypt-phone',
					method: 'POST',
					data: {
						encryptedData: params.encryptedData,
						iv: params.iv,
						session_key: params.session_key
					},
					showLoading: true,
					loadingText: '获取手机号中...'
				})
				
				return {
					phoneNumber: result.phoneNumber,
					purePhoneNumber: result.purePhoneNumber,
					countryCode: result.countryCode
				}
			}
		} catch (error) {
			console.error('获取手机号失败:', error)
			throw error
		}
	}
	
	/**
	 * 微信登录流程
	 * @returns {Promise<Object>}
	 */
	async login() {
		try {
			// 获取登录凭证
			const loginResult = await this.wxLogin()
			
			
			
			return {
				code: loginResult.code
			}
		} catch (error) {
			console.error('微信登录失败:', error)
			throw error
		}
	}
	
	/**
	 * 微信登录（Promise封装）
	 * @returns {Promise<Object>}
	 */
	wxLogin() {
		return new Promise((resolve, reject) => {
			wx.login({
				success: (res) => {
					if (res.code) {
						resolve(res)
					} else {
						reject(new Error(res.errMsg || '获取登录凭证失败'))
					}
				},
				fail: (err) => {
					reject(new Error(err.errMsg || '微信登录失败'))
				}
			})
		})
	}
	
	
}

// 创建单例实例
const wechatApiService = new WechatApiService()

export default wechatApiService
export { WechatApiService }